package smallfrench.moteur.biblio;

import smallfrench.moteur.interp.RObjet;

/**
 * Représente la classe Couleur.
 * @author antoine1023
 *
 */
public class RClasseCouleur extends RClasse {

	public static final RClasseCouleur CLASSE = new RClasseCouleur();

	private RClasseCouleur() {
		super(new RClasse[] {RClasse.CLASSE});
		champs.put("obtenirRouge", OBTENIR_ROUGE);
		champs.put("obtenirVert", OBTENIR_VERT);
		champs.put("obtenirBleu", OBTENIR_BLEU);
	}

	@Override
	public RObjet appeler(RObjet moi, RObjet[] params) {
		switch (params.length) {

		case 1:
			RObjet param = params[0];
			if (param instanceof REntier) {
				REntier rgb = (REntier)param;
				return new RCouleur(rgb.getValeurInt());
			} else if (param instanceof RChaine) {
				String nom = ((RChaine)param).valeur;
				return new RCouleur(nom);
			}

		case 3:
			RObjet argRouge = params[0],
			argVert = params[1],
			argBleu = params[2];

			if (argRouge instanceof REntier
					&& argVert instanceof REntier
					&& argBleu instanceof REntier) {
				REntier r = (REntier)argRouge,
						v = (REntier)argVert,
						b = (REntier)argBleu;

				return new RCouleur(
						r.getValeurInt(),
						v.getValeurInt(),
						b.getValeurInt());
			}
		}
		return new RCouleur();

	}

	@Override
	public RChaine enChaine() {
		return new RChaine("Couleur");
	}


	//------------------------------------------- Statics

	private static abstract class Fonction extends RFonction {

		public abstract RObjet appeler2(RCouleur moi, RObjet[] params);

		@Override
		public final RObjet appeler(RObjet moi, RObjet[] params) {
			if (moi instanceof RCouleur)
				return appeler2((RCouleur)moi, params);
			return null;
		}
	}

	//-------------------------------------------

	private static final Fonction OBTENIR_ROUGE = new Fonction () {
		@Override
		public RObjet appeler2(RCouleur moi, RObjet[] params) {
			return new REntier(moi.valeur.getRed());
		}
	};
	private static final Fonction OBTENIR_VERT = new Fonction () {
		@Override
		public RObjet appeler2(RCouleur moi, RObjet[] params) {
			return new REntier(moi.valeur.getGreen());
		}
	};
	private static final Fonction OBTENIR_BLEU = new Fonction () {
		@Override
		public RObjet appeler2(RCouleur moi, RObjet[] params) {
			return new REntier(moi.valeur.getBlue());
		}
	};

}
